<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Function对象</title>

    <script>
        /**
         * Function：函数（方法）对象
         *             1.创建：
         *                 1. var fun = new Function(形式参数列表, 方法体); //忘掉吧。。。
         *                 2. function 方法名称(形式参数列表){
         *                         方法体
         *                     }
         *                 3. var 方法名 = function(形式参数列表){
         *                         方法体
         *                     }
         *             2.方法
         *             3.属性：
         *                 length：代表形参的个数
         *             4.特点：
         *                 1.方法定义时，形式参数的类型不用写，返回值类型也不写
         *                 2.方法是一个对象，如果定义名称相同的方法，会覆盖
         *                 3.在 JS 中，方法的调用只与 方法的名称 有关，和 参数列表 无关
         *                 4.在方法声明中有一个隐藏的 内置对象（数组），arguments，封装了所有的实际参数
         *             5.调用：
         *                 方法名称(实际参数列表);
         */

        //1.创建方式1
        var fun1 = new Function("a","b","c","alert(a);");
        fun1(1,2);
        alert(fun1.length) //3

        //2.创建方式2
        function fun2(a, b){
            alert(a+b);
        }
        fun2(3,4);
        alert(fun2.length) //2

        //3.创建方式3
        var fun3 = function(a,b){
            alert(a+b);
        }
        fun3(5,6)
        alert(fun3.length) //2

        //方法的覆盖
        fun2 = function(a,b){
            //alert(a-b);
            alert(a);
            alert(b);
        }
        //fun2(7,8);
        fun2(1,2); //1 2
        fun2(1); //1 undefined
        fun2(); //undefined
        fun2(1,2,3); //1 2

        //求任意个 数 的和
        function add() {
            var sum = 0;
            for (var i = 0; i < arguments.length; i++) {
                sum += arguments[i];
            }
            return sum;
        }
        add(1,3);

    </script>

</head>
<body>

</body>
</html>